﻿#include"List.h"
//具体函数的实现


//初始化
void Initi(list* p)
{
	assert(p);
	p->arr = NULL;
	p->number = p->size = 0;
}


//尾插
void PushBack(list* p, Inform data)
{
	assert(p);
	Check(p);
	p->arr[p->size++] = data;//赋值同时有效数据自增
}

//头插
void PushFront(list* p, Inform data)
{
	assert(p);
	Check(p);//检查扩容
	list* cur = p;
	int pos = p->size;
	int i = 0;
	for (i = pos; i > 0; i--)
	{
		p->arr[i] = p->arr[i - 1];
	}
	p->arr[0] = data;
	p->size++;
}

//打印
void Print(list* p)
{
	assert(p);
	for (int i = 0; i < p->size; i++)
	{
		printf("%d ", p->arr[i]);
	}
	printf("\n");
}


//顺序表的销毁
void Delete(list* p)
{
	assert(p);
	free(p->arr);//释放空间
	p->number = p->size = 0;
	p = NULL;
}


//定点插入数据
void Input(list* p, Inform loc, Inform num)
{
	assert(p);
	Check(p);
	int pos = FindData(p, loc);
	if (pos != -1)
	{
		int i;
		for (i = p->size; i >= pos; i--)
		{
			p->arr[i] = p->arr[i - 1];
		}
		p->arr[pos - 1] = num;
		p->size++;//有效数据+1
	}
	else
		printf("没有找到指定数据位置\n");
}


//定点删除数据
void Output(list* p, int loc)
{
	assert(p);
	assert(loc > 0 && loc <= p->number);
	printf("删除的数据为：%d\n", p->arr[loc - 1]);
	int i;
	for (i = loc - 1; i < p->size - 1; i++)
	{
		p->arr[i] = p->arr[i + 1];
	}
	p->size--;

}


//按位置查找数据
Inform* Find_loc(list* p, int loc)
{
	assert(p);
	assert(loc > 0 && loc <= p->number);
	int i;
	for (i = 0; i < p->size; i++)
	{
		if (i == loc - 1)
		{
			printf("找到数据 ：%d\n",p->arr[i]);
			return &(p->arr[i]);
		}
	}
	return NULL;
}


//按值查找数据
Inform Find_val(list* p, Inform value)
{
	assert(p);
	int i;
	for (i = 0; i < p->size; i++)
	{
		if (p->arr[i] == value)
		{
			printf("找到数据位置 ：%d ，值为：%d\n",i + 1 ,p->arr[i]);
			return i + 1;
		}
	}
	printf("未找到数据\n");
	return 0;
}

//判断扩容
void Check(list* p)
{
	if (p->size == p->number)//判断是否需要扩容
	{
		Inform new = p->size == 0 ? 4 : 2 * p->size;//判断大小
		//申请空间
		Inform* tmp = realloc(p->arr, new * sizeof(list));
		if (tmp == NULL)//判断是否开辟空间成功
		{
			perror("realloc");//报错
			exit(1);//退出程序
		}

		p->arr = tmp;//开辟成功进行赋值
		p->number = new;//总大小更新
	}
}

int FindData(list* p, Inform data)
{
	list* cur = p;
	int i = 0;
	while (i < p->size)
	{
		if (p->arr[i++] == data)
			return i;
	}
	return -1;
}